package com.jihu.design.structural.proxy.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 使用cglib帮我们创建代理对象
 * @author jihu
 * @date 2021/9/24
 */
public class CglibProxy {

    //为任意对象创建代理
    public static<T> T createProxy(Class<T> clazz){
        //1.创建一个增强器
        Enhancer enhancer = new Enhancer();

        //2.设置父类
        enhancer.setSuperclass(clazz);

        //3.设置方法回调
        /**
         * public interface MethodInterceptor extends Callback {
         *     Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable;
         * }
         *
         */
        enhancer.setCallback((MethodInterceptor)(obj, method, args, proxy)-> {
            //编写拦截的逻辑
            System.out.println("cglib上场了......");
            //method是获取到原方法的一些数据信息
            //目标方法的执行
            Object invoke = proxy.invokeSuper(obj, args);
            return invoke;
        });
        return (T) enhancer.create();
    }
}
